package com.example.lt.authority;

import org.springframework.util.ObjectUtils;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author 小涛Tao
 * @Date: 2024/08/17/15:54
 * version 1.0 注释：
 **/
public class AuthorityUtils {

    /**用户权限集合，key为用户id，value为用户拥有权限*/
    private static Map<Long, Collection<String>> map = new HashMap<>();

    /**全局权限校验类*/
    private static Class c;

    /**
     * 是否开启全局校验 默认为false不开启
     */
    private static Boolean globalVerify = false;

    /**
     * 设置全局权限校验状态
     * @param state true：开启  false：关闭
     * @param o 全局权限校验类
     */
    public static void setGlobalVerify(Boolean state, Object o) {
        if (o == null) {
            throw new NullPointerException();
        } else if (!(o instanceof AuthorityVerify)) {
            throw new ClassCastException(o.getClass() + "不是 AuthorityVerify 接口的实现类");
        }

        c = o.getClass();
        globalVerify = state;
    }

    /**
     * 获取全局校验开启状态
     * @return
     */
    public static Boolean getGlobalVerify() {
        return globalVerify;
    }

    public static Class getVerifyClass() {
        return c;
    }

    /**
     * 添加权限
     * @param userId 用户
     * @param authority 权限集合
     */
    public static void setAuthority(Long userId, Collection<String> authority) {
        // 用户id为key，权限集合为value
        map.put(userId, authority);
    }

    /**
     * 校验权限
     * @param userId 用户id
     * @param authority 单个权限
     * @return
     */
    public static Boolean verify(Long userId, String authority) {
        // 检查 map 权限集合中，有没有 userId 用户的权限集合存在
        if (ObjectUtils.isEmpty(map.get(userId))) {
            return false;
        }
        return map.get(userId).contains(authority); // 判断用户拥有的权限集合中有没有 authority 权限
    }

}
